package T03_事务的ACID及4种隔离级别.H01_ACID;

/**
 *一、事务的ACID属性   ---BAT 百度 阿里 腾讯   --BBA 宝马奔驰跟奥迪  --TMD 头条 美团 滴滴
 *    1.原子性
 *        原子性是指事务是一个不可分割的工作单位，事务中的操作要么都发生，要么都不发生。
 *    2.一致性（Consistency）
 *        事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
 *        数据守恒--数据操作前和数据操作后的价钱是一致的
 *    3.隔离性（Isolation）
 *        事务的隔离性是指一个事务的执行不能被其他事务干扰，
 *        即一个事务内部的操作及使用的数据对并发的其他事务是隔离的，
 *        并发执行的各个事务之间不能互相干扰。
 *    4.持久性（Durability）
 *        持久性是指一个事务一旦被提交，它对数据库中数据的改变就是永久性的，
 *        接下来的其他操作和数据库故障不应该对其有任何影响。
 *二、数据库的并发问题
 *    1.对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:
 *      ①脏读:对于两个事务 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段。之后,
 *        若 T2 回滚, T1读取的内容就是临时且无效的。
 *      ②不可重复读:对于两个事务T1, T2, T1 读取了一个字段, 然后 T2更新了该字段。之后,
 *        T1再次读取同一个字段, 值就不同了。
 *      ③幻读:对于两个事务T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行。
 *        之后, 如果 T1 再次读取同一个表, 就会多出几行。
 *    2.数据库事务的隔离性:数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题。
 *    3.一个事务与其他事务隔离的程度称为隔离级别。数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度,
 *      隔离级别越高, 数据一致性就越好, 但并发性越弱。
 *三、隔离性的四种隔离级别（一致性和并发性）
 *    1.数据库提供了四种隔离级别
 *      ①.READ UNCOMMITTED 读未提交  允许事务读取被其他事物提交的变更,脏读,不可重复读都会出现
 *      ②.READ COMMITED    读已提交  只允许事务读取已被其他事务提交的变更,可以避免脏读 但是不可重复读和幻读仍然存在
 *      ③.REPEATABLE READ  可重复读  确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新
 *         可以避免脏读和不可重复读,但是幻读问题仍然存在
 *      ④.SERIALIZABLE     串行化    确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入,更新和删除操作
 *         所有的并发问题都可以被避免,但是呢性能十分低下
 *    2.Oracle 支持两种事务的隔离级别 READ COMMITED SERIALIZABLE  Oracle 默认的事务隔离级别为: READ COMMITED
 *    3.Mysql 支持 4 种事务隔离级别。Mysql 默认的事务隔离级别为: REPEATABLE READ
 *    4.在显示生活中,按照人的思考方式,选用读已提交就是比较正常的,mysql 为了保证更强的一致性选用了可重复读,但是相对于来说并发性就稍微差了一些
 * 四、测试黑窗口测试隔离级别
 *    1.cmd 停止数据库
 *        net stop  mysql57
 *    2.cmd 启动数据库
 *        net start mysql57
 *    3.查看默认的隔离级别
 *        5.7 select @@tx_isolation; 默认为 REPEATABLE-READ  
 *        8.0 select @@transaction_isolation
 *    4.设置事务的隔离界别
 *        set session transaction isolation level read uncommitted
 *    5.表中内容有中文 设置 gbk字符编码
 *        set names gbk
 *    6.开启一个事务
 *        set autocommit=0或者 set autocommit=false   conn.setAutoCommit(false);(代码中的体现)
 *    7.总结:
 *      >数据库默认是可重复读：
 *       三种并发问题描述:
 *         1.脏读: 事务A更改数据  未提交  事务B 读取事务A未提交的数据,假如事务A要回滚  那么事务B读取的内容就是临时且无效的(更新)
 *         2.不可重复读:是指在数据库访问中，一个事务范围内两个相同的查询却返回了不同数据。
 *         3.幻读:对于两个事务T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行。之后, 如果 T1 再次读取同一个表, 就会多出几行。
 *       表格记忆术
 *         事务的隔离级别          脏读             不可重复读       幻读
 *         read uncommitted       √                  √             √
 *         read committed         X                  √             √
 *         repeatable read        x                  x             √
 *         serializable           x                  x             x
 * &、课外知识
 *    1.如何删除服务栏里边的服务
 *    sc delete MySQL57  注意使用管理员权限打开 cmd
 */
public class ACIDTest01 {
}
